home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A)[a].zip / Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A)[a].po / WORKS.OBJ.S < prev    next >
Text File  |  1996-12-24  |  12KB  |  467 lines

  1. *************************
  2. * WORKS.OBJ Source Code *
  3. *  BY MIKE JETZER       *
  4. *  COPYRIGHT (C) 1989   *
  5. *  MICROSPARC, INC.     *
  6. *  CONCORD, MA 01742    *
  7. *************************
  8.  
  9. * MERLIN ASSEMBLER
  10.  
  11.           ORG $2000
  12.  
  13. MLI       = $BF00
  14.  
  15. FILEBUF   = $2C00        ;Input file buffer
  16. FILE2BUF  = $3000        ;Output file buffer
  17. DATABUF   = $3400        ;Buffer for input & output data
  18.  
  19. CV        = $25          ;Vertical cursor pos
  20. IBUFF     = $200         ;Input buffer
  21. STROBE    = $C010        ;Keyboard strobe
  22.  
  23. PRBL2     = $F94A        ;Print # of spaces in X-reg
  24. VTAB      = $FC22
  25. HOME      = $FC58
  26. WAIT      = $FCA8
  27. RDKEY     = $FD0C        ;Get a key
  28. GETLN1    = $FD6F        ;Get a line of input
  29. CROUT     = $FD8E        ;Output a CR
  30. PRBYTE    = $FDDA        ;Print hex number held in acc
  31. COUT      = $FDED
  32.  
  33. PRINTOUT  MAC            ;Print a message
  34.           LDX #<]1
  35.           LDY #>]1
  36.           JSR MSGOUT
  37.           <<<
  38.  
  39.  
  40.           JMP MENU
  41. PASS2BAS  DS 1           ;Pass parameter to basic program
  42.  
  43.  
  44. * MENU - Do main menu
  45.  
  46. MENU      JSR HOME
  47.           LDX #12
  48.           JSR PRBL2
  49.           PRINTOUT TOPLINE ;Print top line
  50.           LDX #4
  51.           JSR PRBL2
  52.           PRINTOUT SECLINE ;Print second line
  53.           LDA #21
  54.           STA CV
  55.           JSR VTAB
  56.           LDX #9
  57.           JSR PRBL2
  58.           PRINTOUT THRDLINE ;Print third line
  59.           LDX #3
  60.           JSR PRBL2
  61.           PRINTOUT FRTHLINE
  62.           LDA #3
  63.           STA CV
  64.           JSR VTAB
  65.           LDX #9
  66.           JSR PRBL2
  67.           PRINTOUT CONVLINE ;"Convert File"
  68.           LDX #9
  69.           JSR PRBL2
  70.           PRINTOUT ALLLINES ;"CR after each line"
  71.           LDX #9
  72.           JSR PRBL2
  73.           PRINTOUT CR_LF ;"CR/LF after each line"
  74.           LDX #9
  75.           JSR PRBL2
  76.           PRINTOUT DIR   ;"Dir listing"
  77.           LDX #9
  78.           JSR PRBL2
  79.           PRINTOUT QUITMSG ;"Quit"
  80.  
  81.           JSR CROUT
  82.           PRINTOUT CHOOSE ;Print prompt
  83. GET       LDA #0
  84.           STA STROBE
  85.           JSR RDKEY      ;Get a key
  86.           AND #%11011111 ;Convert from lower to upper case
  87.           CMP #"C"       ;Check if it's a valid keypress
  88.           BEQ VALID
  89.           CMP #"R"
  90.           BEQ VALID
  91.           CMP #"L"
  92.           BEQ VALID
  93.           CMP #$9F       ;Question mark?
  94.           BEQ GOTO_BAS
  95.           CMP #"Q"
  96.           BEQ GOTO_BAS
  97.           JSR NOISE      ;If not valid, complain
  98.           JMP GET        ;Try again
  99.  
  100. GOTO_BAS  STA PASS2BAS
  101.           RTS
  102.  
  103. VALID     LDX #0         ;Zero out flags for
  104.           STX EACHLINE   ; CR after each line flag
  105.           STX LINEFEED   ; LF flag
  106.  
  107.           CMP #"C"       ;If plain convert, begin processing
  108.           BEQ BEGIN
  109.  
  110.           INC EACHLINE   ;Both remaining options need  CR after each line
  111.           CMP #"E"
  112.           BEQ BEGIN      ;If "E", begin
  113.           INC LINEFEED   ; otherwise set linefeed flag
  114.  
  115. BEGIN     LDA #1
  116.           JMP GOTO_BAS
  117.           JSR CLOSE      ;Close all files
  118.  
  119.           JSR MLI
  120.           HEX C4         ;GET_FILE_INFO
  121.           DA INFOPARM    ;Get info about input file
  122.  
  123.           BCC OK0
  124.           JMP ERROR
  125.  
  126. OK0       LDA FILETYPE
  127.           CMP #$1A       ;Is it a AWP file?
  128.           BEQ OK00
  129.  
  130.           JSR NOISE      ;NO -> exit
  131.           JSR CROUT
  132.           JSR CROUT
  133.           PRINTOUT NOTAWP
  134.           JMP ENDERR
  135.  
  136. OK00      JSR MLI        ;Open input file
  137.           HEX C8         ;Open
  138.           DA OPENPARM
  139.  
  140.           BCC OK1        ;If no errors
  141.           JMP ERROR
  142.  
  143. OK1       LDA INNUM      ;Copy reference number
  144.           STA INNUM3     ; to read parm table
  145.  
  146.           JSR MLI        ;Delete old output file, if it exists
  147.           HEX C1         ;Destroy
  148.           DA DELPARM
  149.  
  150.           BCC OK2        ;No error
  151.           CMP #$46       ;If a file not found error
  152.           BEQ OK2        ; it's OK
  153.           JMP ERROR
  154.  
  155. OK2       JSR MLI        ;Create the output file
  156.           HEX C0         ;Create
  157.           DA CRTPARM
  158.  
  159.           BCC OK3
  160.           JMP ERROR
  161.  
  162. OK3       JSR MLI        ;Open output file
  163.           HEX C8         ;Open
  164.           DA OUTPARM
  165.  
  166.           BCC OK4
  167.           JMP ERROR
  168.  
  169. OK4       LDA OUTNUM     ;Get reference number
  170.           STA OUTNUM2    ;Store it in write parm table
  171.  
  172.           LDA #>300      ;Read 300 byte header
  173.           STA READLEN+1
  174.           LDA #<300
  175.           STA READLEN
  176.           JSR READ       ;Read 1st 300 bytes
  177.  
  178. NEXT      LDA #0
  179.           STA READLEN+1
  180.           STA CR_FLAG    ;Zero out CR_FLAG
  181.           LDA #2
  182.           STA READLEN
  183.           JSR READ       ;Read 2 bytes
  184.           BCC OK6
  185.           JMP ERROR
  186.  
  187. OK6       LDA DATABUF+1
  188.           CMP #$FF       ;End of file?
  189.           BNE CMPNEXT
  190.  
  191.           JSR CLOSE      ;If EOF, close files
  192.           JMP MENU       ;Go back to main menu
  193.  
  194. CMPNEXT   CMP #$D0       ;Blank CR line?
  195.           BNE CMPNEXT2
  196.  
  197.           LDA #0         ;Prepare to write one byte
  198.           STA REQLEN+1
  199.           LDA #1
  200.           STA REQLEN
  201.           LDA #13        ;Carriage return
  202.           STA DATABUF
  203.           JMP ADD_LF     ;Determine if adding LF after each line
  204.  
  205. CMPNEXT2  CMP #$D1       ;Is it a format option?
  206.           BLT PROCESS
  207.           JMP NEXT       ; if so, skip it & get next
  208.  
  209. PROCESS   LDA #2
  210.           STA READLEN
  211.           JSR READ       ;Get next two header bytes
  212.  
  213.           LDA DATABUF+1
  214.           AND #%10000000 ;Isolate high bit
  215.           CMP #%10000000
  216.           BLT NO_CR
  217.  
  218.           LDA #1
  219.           STA CR_FLAG
  220.  
  221. NO_CR     LDA DATABUF+1
  222.           AND #%01111111 ;Isolate low 7 bits
  223.           STA READLEN
  224.           STA REQLEN
  225.           JSR READ       ;Read the actual text bytes
  226.  
  227.           LDX #0
  228. CHECK     LDA DATABUF,X
  229.           CMP #$B        ;Sticky space
  230.           BNE NEXTOPT
  231.           LDA #$20       ;Change sticky space to normal space
  232.           STA DATABUF,X
  233. NEXTOPT   CMP #$20
  234.           BGE NEXTCHAR   ;If not format option, continue
  235.           TXA
  236.           TAY
  237. SQUEEZE   LDA DATABUF+1,Y ;Move everything left, eliminating
  238.           STA DATABUF,Y  ;  format option
  239.           INY
  240.           CPY REQLEN
  241.           BNE SQUEEZE
  242.           DEX            ;To cancel the next INX
  243.           DEC REQLEN
  244. NEXTCHAR  INX
  245.           CPX REQLEN
  246.           BNE CHECK
  247.  
  248.           LDA EACHLINE
  249.           BNE ADD_CR     ;Each line flag is set
  250.  
  251.           LDA CR_FLAG
  252.           BEQ WRITE      ;Normal CR at EOLN is not set
  253.  
  254. ADD_CR    LDX REQLEN
  255.           INC  REQLEN
  256.           LDA #13
  257.           STA DATABUF,X
  258.  
  259. ADD_LF    LDA LINEFEED
  260.           BEQ WRITE      ;LF flag is not set
  261.           LDX REQLEN
  262.           INC REQLEN
  263.           LDA #10        ;ASCII LF
  264.           STA DATABUF,X
  265.  
  266. WRITE     JSR MLI        ;Write to output file
  267.           HEX CB         ;Write
  268.           DA WRTPARM
  269.  
  270.           BCC OK7
  271.           JMP ERROR
  272.  
  273. OK7       JMP NEXT       ;Do another line
  274.  
  275.  
  276. * Handle an MLI error
  277.  
  278. ERROR     PHA            ;Save error code
  279.           JSR CLOSE      ;Close all files
  280.           JSR NOISE      ;Sound beep
  281.           JSR CROUT
  282.           PRINTOUT ERMSG ;Write error message
  283.           PRINTOUT ERTYPE ;Print error type message
  284.           PLA            ; and the error number
  285.           STA SAVE
  286.           JSR PRBYTE
  287.           PRINTOUT DASH  ; and the dash after it
  288.  
  289.           LDA SAVE       ;Get error number
  290.  
  291. * Determine what error occurred, and print appropriate message
  292.  
  293.           LDX #0
  294. ERRLOOP   LDA ERRTABLE,X ;Check for each error type
  295.           CMP SAVE
  296.           BEQ ERROUT     ;Exit if a match
  297.           INX
  298.           CPX #12
  299.           BNE ERRLOOP    ;If no match, x = 12 (offset for misc error)
  300. ERROUT    TXA            ;Double the value in X-reg
  301.           STA SAVE       ; to get offset for printing error message
  302.           CLC
  303.           ADC SAVE
  304.           TAX
  305.           INX
  306.           LDA ERRADDR,X  ;Get addr of error message
  307.           TAY
  308.           DEX
  309.           LDA ERRADDR,X
  310.           TAX
  311.           JSR MSGOUT     ;Print error message
  312.  
  313. ENDERR    PRINTOUT ANYKEY ;"Press Return to continue"
  314.           LDA #0
  315.           STA STROBE     ;Clear strobe
  316.           JSR RDKEY      ;Get that key
  317.           JMP MENU
  318.  
  319.  
  320. * CLOSE - closes all files
  321.  
  322. CLOSE     JSR MLI
  323.           HEX CC         ;Close
  324.           DA CLSPARM
  325.           RTS
  326.  
  327. READ      JSR MLI        ;Read a line from input file
  328.           HEX CA         ;READ
  329.           DA READPARM
  330.           RTS
  331.  
  332.  
  333. * MSGOUT - prints out message (ending in $00) whose high byte
  334. *          is in the Y-reg and low byte is in the X-reg
  335.  
  336. MSGOUT    STX ADDR+1
  337.           STY ADDR+2
  338.           LDX #0
  339. ADDR      LDA $FFFF,X
  340.           CMP #0
  341.           BEQ :OK
  342.           JSR COUT
  343.           INX
  344.           JMP ADDR
  345. :OK       RTS
  346.  
  347.  
  348. *
  349. * NOISE - Sound buzz
  350. *
  351.  
  352. NOISE     LDX #$50
  353. LOOP2     DEX
  354.           LDA #$1D
  355.           JSR WAIT
  356.           LDA $C030
  357.           CPX #0
  358.           BNE LOOP2
  359.           RTS
  360.  
  361.  
  362. TOPLINE   ASC "Works Processor"8D00
  363. SECLINE   ASC "AppleWorks to Text File Utility"8D00
  364. THRDLINE  ASC "Written by Mike Jetzer"8D00
  365. FRTHLINE  ASC "Copyright(C) 1989 by MicroSPARC, Inc."8D00
  366. CONVLINE  ASC "C - Convert AWP to TXT"8D00
  367. ALLLINES  ASC "R - Add CR after each line"8D00
  368. CR_LF     ASC "L - Add CR/LF after each line"8D00
  369. DIR       ASC "? - Catalog/Set Prefix"8D00
  370. QUITMSG   ASC "Q - Quit"8D00
  371. CHOOSE    ASC "Choose - "00
  372. ERMSG     ASC "Unexpected error."8D00
  373. ERTYPE    ASC "ProDOS error $"00
  374. DASH      ASC " - "00
  375. IOERR     ASC "I/O Error"8D00
  376. WRITPROT  ASC "Write Protected"8D00
  377. BADNAME   ASC "Bad Pathname Syntax"8D00
  378. NOPATH    ASC "Nonexistent Pathname"8D00
  379. NOMOUNT   ASC "Vol Not Mounted"8D00
  380. NOTFOUND  ASC "File Not Found"8D00
  381. DISKFULL  ASC "Disk Full"8D00
  382. DIRFULL   ASC "Volume Dir Full"8D00
  383. FILEOPEN  ASC "File Already Open"8D00
  384. FILELOCK  ASC "Output File Locked"8D00
  385. NOTPROD   ASC "Not a ProDOS Disk"8D00
  386. BADBIT    ASC "Bad Vol Bitmap"8D00
  387. MISCERR   ASC "Misc. Error"8D00
  388. NOTAWP    ASC "Input file is not of type AWP"8D00
  389. ANYKEY    ASC "Press Return to continue "00
  390.  
  391. * Table of ProDOS error message types
  392.  
  393. ERRTABLE  DFB $27,$2B,$40,$44,$45,$46,$48,$49,$4E,$50,$52,$5A
  394.  
  395. * Table of error message addresses
  396.  
  397. ERRADDR   DA IOERR
  398.           DA WRITPROT
  399.           DA BADNAME
  400.           DA NOPATH
  401.           DA NOMOUNT
  402.           DA NOTFOUND
  403.           DA DISKFULL
  404.           DA DIRFULL
  405.           DA FILELOCK
  406.           DA FILEOPEN
  407.           DA NOTPROD
  408.           DA BADBIT
  409.           DA MISCERR
  410.  
  411. SAVE      DS 1
  412. EACHLINE  DS 1
  413. LINEFEED  DS 1
  414. CR_FLAG   DS 1
  415.  
  416. *
  417. * MLI parameter tables
  418. *
  419.  
  420. OPENPARM  HEX 03         ;Parm table to open input file
  421.           DA INPATH
  422.           DA FILEBUF
  423. INNUM     DS 1
  424.  
  425. OUTPARM   HEX 03         ;Parm table to open output file
  426.           DA OUTPATH
  427.           DA FILE2BUF
  428. OUTNUM    DS 1
  429.  
  430. READPARM  HEX 04         ;Parm table to read input file
  431. INNUM3    DS 1
  432.           DA DATABUF
  433. READLEN   DS 2
  434.           DS 2
  435.  
  436. WRTPARM   HEX 04         ;Parm table to write output file
  437. OUTNUM2   DS 1
  438.           DA DATABUF
  439. REQLEN    DS 2           ;Requested length to write
  440.           DS 2           ;Actual length written - ignored
  441.  
  442. CLSPARM   HEX 01         ;Parm table to close all files
  443.           HEX 00         ;Close ALL files
  444.  
  445. CRTPARM   HEX 07         ;Parm table to create output file
  446.           DA OUTPATH
  447.           HEX C3         ;Access bits; set for full access
  448.           HEX 04         ;Type TXT
  449.           DS 2 Aux file type; not used
  450.           HEX 01         ;Storage type; seedling file
  451.           DS 2           ;Date; MLI sets this
  452.           DS 2           ;Time; MLI sets this
  453.  
  454. DELPARM   HEX 01         ;Parm table to delete existing output file
  455.           DA OUTPATH
  456.  
  457. INFOPARM  HEX 0A         ;GET_FILE_INFO parm table
  458.           DA INPATH
  459.           DS 1
  460. FILETYPE  DS 1
  461.           DS 13
  462.  
  463. * Buffers for input & output pathnames
  464.  
  465. INPATH    DS 65          ;1 for length, 64 for pathname
  466. OUTPATH   DS 65
  467.